昨天筆記了基礎Vue Router 以及 History概念,今天繼續筆記其他細項用法。
將不同路由導向同個元件,可視為帶入不同參數至同元件中。
於route.js 新增路由
import Shop from '../views/Shop.vue'
{
name: 'shop',
path: "/Shop/:id", // params 參數 id
component: Shop
}
新增shop.vue
<div>
<h1>SHOP {{id}}</h1>
</div>
透過computed即時抓取新id
computed: {
id() {
return this.$route.params.id;
}
}
於App.vue 新增進入點
<router-link to="/shop/1" style="margin-left:10px">shop1</router-link>
<router-link to="/shop/2" style="margin-left:10px">shop2</router-link>
且可透過上下頁切換,並紀錄於瀏覽器中
watch: {
$route(to, from) {
console.log(to) // 目的地
console.log(from) // 原地
}
},
透過 * 實現,實現所有路由建議用於最後
,可用於導向NotFound頁面
path: '*', // 所有路徑
path: 'shop-*', // 所有shop開頭路徑
透過?實現
// match /shop/xxx and /shop
path: '/shop/:id?',
path: '/shop/:id',
透過children
實現
{
name: 'shop',
path: "/shop/:id", // 帶入參數 id
component: Shop,
children: [
{
// 當 /shop/:id/product 匹配成功,
// Product 会被渲染在 Shop 的 <router-view> 中
path: 'product', // 不可加上 /,否則將回根目錄
component: Product
},
{
// 當 /shop/:id/clerk 匹配成功,
// Clerk 会被渲染在 Shop 的 <router-view> 中
path: 'clerk',
component: Clerk
}
]
},
如上述範例中,不同的route中有其各自name屬性
,可在引用時讓程式碼更簡潔。
{
name: 'helloWorld', //組件呈現名稱
path: '/', //對應路徑
component: HelloWorld //對應組件
},
定義name於<router-view>
中,同頁面出現多個<router-view>
,有利於辨識與維護。
<router-view name="Header"></router-view>
<router-view name="Sidebar"></router-view>
需於routes中定義<router-view>
所對應的元件
{
name: 'Home',
path: '/',
components: {
default: HelloWorld, // 預設
product: Product, // <router-view> name: product
clerk: Clerk
}
}
透過routes中redirect實現
透過路徑導向
{ path: '/home', redirect: '/clerk' }
//透過名稱導向
{ path: '/home', redirect: { name: 'clerk' }}
// 方法導向
{ path: '/a', redirect: to => { params }}
透過
透過routes中alias實現,讓視圖在不改變URL情況下看到其他頁面。
// 使用者在/home頁面時,顯示/內容,URL不導向。
{ path: '/', component: Home, alias: '/home' }
// 多別名
alias: ['/home', '/homePage']
一般使用上,透過:xxx & $route
傳遞參數會形成高耦合
情境,使元件的重用性降低,而Vue Router提供了props取代$route.params的做法,透過props: true
實現。
$route.params
[{ path: '/shop/:id', component: Shop }]
props
[{ path: '/shop/:id', component: Shop, props: true }]
具名路由props,需個別設置
{
name: 'Home',
path: '/',
components: {
default: HelloWorld, // 預設
product: Product,
clerk: Clerk
},
props: {
default: true, // 預設
product: true,
clerk: false
}
},
元件可將計算屬性調整為prop接收
props: {
id: String
},
有需要時才載入元件(lazy-loading),透過調整route中component為import實現。
// 直接引入
import Shop from '../views/Shop.vue'
component: Shop,
// 非同步
component: () => import ('../views/Shop.vue'),
有錯誤請不吝指教!
參考資料
https://vuejs.org/v2/guide
https://book.vue.tw/CH4/4-1-vue-router-intro.html
感謝各路大神